import re
from django.http import Http404
from django import forms
from django.contrib.auth import authenticate
from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _
from saip.proyecto.models import Proyecto
from saip.proyecto.models import TipoArtefacto
from saip.proyecto.models import Artefacto
from saip.usuario.models import Usuario
from saip.usuario.models import Rol

"""
Formularios para el manejo del modulo del proyecto.
:author: Marco Rolon, Bianca Benegas
"""
class ProyectoForm(forms.Form):
    """
    Clase que genera el formulario para registrar un nuevo proyecto.
    """
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    descripcion = forms.CharField(label=u'Descripci\xf3n', widget=forms.Textarea(attrs={'rows':3, 'cols':60}), max_length=200)
    lider = forms.ModelChoiceField(label=u'L\xedder', queryset=Usuario.objects.all(), widget=forms.Select(attrs={'size':1}))
    
    def clean_nombre(self):
        """
        Comprueba que el nomdre del proyecto sea introducido con el formato correcto.
        Adem\xa9s, verifica si ya existe un proyecto con el nombre introducido actualmente.
        """
        nombre = self.cleaned_data['nombre']
        if not re.search(r'^\w+$', nombre):
            raise forms.ValidationError('Username solo puede tener caract\xe9res alfanum\xe9ricos.')
        try:
            Proyecto.objects.get(nombre=nombre)
        except Proyecto.DoesNotExist:
            return nombre
        raise forms.ValidationError('Ya hay un proyecto con ese nombre.')

class ProyectoEditForm(forms.Form):
    """
    Clase que genera el formulario para la edicion del registro del proyecto.
    """
    idproy = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    descripcion = forms.CharField(label=u'Descripci\xf3n', widget=forms.Textarea(attrs={'rows':3, 'cols':60}), max_length=200)
    #lider = forms.ModelChoiceField(label=u'L\xedder', queryset=Usuario.objects.all())
    #estado = forms.CharField(label=u'Estado', widget=forms.TextInput(attrs={'size': 64}))
    def clean_nombre(self):
        """
        Comprueba que el nomdre del proyecto sea introducido con el formato correcto.
        Ademas, verifica si ya existe un proyecto con el nombre introducido actualmente.
        """
        nombre = self.cleaned_data['nombre']
        idproy = self.data['idproy']
        if not re.search(r'^\w+$', nombre):
            raise forms.ValidationError('Username solo puede tener caract\xe9res alfanum\xe9ricos.')
        try:
            proy = Proyecto.objects.get(nombre=nombre)
            if proy.id == int(idproy):
                return nombre
        except Proyecto.DoesNotExist:
            return nombre
        raise forms.ValidationError('Ya hay un proyecto con ese nombre.')
               
        
FASE_CHOICES = (
        ('A', u'An\xe1lisis de Requerimientos'),
        ('D', u'Dise\xf1o'),
        ('I', u'Implementaci\xf3n'),
    )
class TipoArtForm(forms.Form):
    """
    Clase que genera el formulario para registrar un nuevo tipo de artefacto.
    """
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    codigo = forms.CharField(label=u'C\xf3digo', max_length=4, widget=forms.TextInput(attrs={'size': 4}))
    proyecto = forms.CharField(label=u'Proyecto', widget=forms.TextInput(attrs={'readonly': 'readonly', 'size': 64}), max_length=64, required=False)
    fase = forms.ChoiceField(label=u'Fase', choices= FASE_CHOICES)
    #icono = forms.ImageField(required=False, label='Icono')
    #icono = forms.CharField(label=u'Icono', widget=forms.TextInput(attrs={'size': 100}))
	
    def clean_nombre(self):
        """
        Verifica si ya existe un tipo de artefacto con el nombre introducido actualmente.
        """
        nombre = self.cleaned_data['nombre']
        proyecto = self.data['proyecto']
        try:
            proy = Proyecto.objects.get(nombre=proyecto)
            TipoArtefacto.objects.get(nombre=nombre, proyec_tipoar=proy)
        except TipoArtefacto.DoesNotExist:
            return nombre
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError('Ya hay un tipo de artefacto con ese nombre.')

    def clean_codigo(self):
        """"
        Verifica si ya existe un tipo de artefacto con el codigo introducido actualmente.
        """
        codigo = self.cleaned_data['codigo']
        proyecto = self.data['proyecto']
        try:
            proy = Proyecto.objects.get(nombre=proyecto)
            TipoArtefacto.objects.get(codigo=codigo, proyec_tipoar=proy)
        except TipoArtefacto.DoesNotExist:
            return codigo
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError(u'Ya hay un c\xf3digo igual.')

class TipoArtGralForm(forms.Form):
    """
    Clase que genera el formulario para registrar un nuevo tipo de artefacto general.
    Estos tipos de artefactos generales pueden ser creados por el administrados del
    sistema y usados como una sugerencia por el lider del proyecto.
    """
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    codigo = forms.CharField(label=u'C\xf3digo', max_length=4, widget=forms.TextInput(attrs={'size': 4}))
    fase = forms.ChoiceField(label=u'Fase', choices= FASE_CHOICES)
    #icono = forms.ImageField(required=False, label='Icono')
    def clean_nombre(self):
        """
        Verifica si ya existe un tipo de artefacto con el nombre introducido actualmente.
        """
        nombre = self.cleaned_data['nombre']
        #proyecto = self.data['proyecto']
        try:
            #proy = Proyecto.objects.get(nombre=proyecto)
            TipoArtefacto.objects.get(nombre=nombre, proyec_tipoar=None)
        except TipoArtefacto.DoesNotExist:
            return nombre
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError('Ya hay un tipo de artefacto con ese nombre.')

    def clean_codigo(self):
        """"
        Verifica si ya existe un tipo de artefacto con el codigo introducido actualmente.
        """
        codigo = self.cleaned_data['codigo']
        #proyecto = self.data['proyecto']
        try:
            #proy = Proyecto.objects.get(nombre=proyecto)
            TipoArtefacto.objects.get(codigo=codigo, proyec_tipoar=None)
        except TipoArtefacto.DoesNotExist:
            return codigo
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError(u'Ya hay un c\xf3digo igual.')
	
class TipoArtEditForm(forms.Form):
    """
    Clase que genera el formulario para la edicion del registro del tipo de artefacto.
    """
    FASE_CHOICES = (
        ('A', u'An\xe1lisis de Requerimientos'),
        ('D', u'Dise\xf1o'),
        ('I', u'Implementaci\xf3n'),
    )
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    codigo = forms.CharField(label=u'C\xf3digo', max_length=4, widget=forms.TextInput(attrs={'size': 4}))
    proyecto = forms.CharField(label=u'Proyecto', widget=forms.TextInput(attrs={'readonly': 'readonly', 'size': 64}), max_length=64, required=False)
    fase = forms.ChoiceField(label=u'Fase', choices= FASE_CHOICES)
    #icono = forms.ImageField(required=False, label='Icono')
    idtipo = forms.IntegerField(widget=forms.HiddenInput(attrs={'size': 12}), required=False)
	
    def clean_nombre(self):
        """
        Verifica si ya existe un tipo de artefacto con el nombre introducido actualmente.
        """
        nombre = self.cleaned_data['nombre']
        proyecto = self.data['proyecto']
        idtipo = self.data['idtipo']
        try:
            proy = Proyecto.objects.get(nombre=proyecto)
            tipouno = TipoArtefacto.objects.get(nombre=nombre, proyec_tipoar=proy)
            tipodos = TipoArtefacto.objects.get(id=idtipo)
            if tipouno.nombre==tipodos.nombre:
                return nombre
        except TipoArtefacto.DoesNotExist:
            return nombre
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError('Ya hay un tipo de artefacto con ese nombre.')

    def clean_codigo(self):
        """"
        Verifica si ya existe un tipo de artefacto con el codigo introducido actualmente.
        """
        codigo = self.cleaned_data['codigo']
        proyecto = self.data['proyecto']
        try:
            proy = Proyecto.objects.get(nombre=proyecto)
            tipouno = TipoArtefacto.objects.get(codigo=codigo, proyec_tipoar=proy)
            tipodos = TipoArtefacto.objects.get(codigo=codigo, proyec_tipoar=proy)
            if tipouno.codigo==tipodos.codigo:
                return codigo
        except TipoArtefacto.DoesNotExist:
            return codigo
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError(u'Ya hay un c\xf3digo igual.')

class TipoArtGralEditForm(forms.Form):
    """
    Clase que genera el formulario para la edicion del registro del tipo de artefacto general.
    """
    FASE_CHOICES = (
        ('A', u'An\xe1lisis de Requerimientos'),
        ('D', u'Dise\xf1o'),
        ('I', u'Implementaci\xf3n'),
    )
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    codigo = forms.CharField(label=u'C\xf3digo', max_length=4, widget=forms.TextInput(attrs={'size': 4}))
    fase = forms.ChoiceField(label=u'Fase', choices= FASE_CHOICES)
    #icono = forms.ImageField(required=False, label='Icono')
    idtipo = forms.IntegerField(widget=forms.HiddenInput(attrs={'size': 12}), required=False)

class ArtefactoAnForm(forms.Form):
    """
    Clase que genera el formulario para registrar un nuevo tipo de artefacto de la 
    fase de analisis de requerimientos.
    """
    idproy = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    #idart = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    tipoArtefacto = forms.ModelChoiceField(label=u'Tipo de Artefacto', queryset=TipoArtefacto.objects.all())
    #proyecto = forms.ModelChoiceField(label=u'Proyecto', queryset=Proyecto.objects.all())
    #nro_artefacto = forms.IntegerField(label=u'Nro Artefacto', widget=forms.TextInput(attrs={'size': 10}))
    descr_breve = forms.CharField(label=u'Descripci\xf3n breve', widget=forms.TextInput(attrs={'size': 100}))
    descr_detallada = forms.CharField(label=u'Descripci\xf3n detallada', widget=forms.Textarea(attrs={'rows':5, 'cols':80}), max_length=400)
    complejidad = forms.IntegerField(label=u'Complejidad', widget=forms.TextInput(attrs={'size': 10}))
    adjunto = forms.FileField(required=False, label='Adjunto')
    relacionhijo = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False)
    
    def clean_nombre(self):
        """"
        Verifica si ya existe un tipo de artefacto con el nombre introducido actualmente.
        """
        nombre = self.cleaned_data['nombre']
        idproy = self.data['idproy']
        tipoArtefacto = self.data['tipoArtefacto']
        try:
            proy = Proyecto.objects.get(id=idproy)
            #tipoArtefacto = TipoArtefacto.objects.get(nombre=tipoNombre, proyec_tipoar=proy)
            Artefacto.objects.get(nombre=nombre, proyecto=proy, tipoArtefacto=tipoArtefacto)
        except Artefacto.DoesNotExist:
            return nombre
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError('Ya hay un tipo de artefacto con ese nombre.')
        
    def clean_complejidad(self):
        """"
        Comprueba que la complejidad del artefacto sea intorducida con el formato correcto.
        El formato debe ser numerico, los numeros deben ser mayores o iguales a 1 y menores
        o iguales a 10.
        """
        complejidad = self.cleaned_data['complejidad']
        if complejidad>10:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        if complejidad<1:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        return complejidad
    #def __init__(self, project_id):
    #    super(ArtefactoAnForm, self).__init__()
    #    self.fields["relaciones"].queryset = Artefacto.objects.filter(proyecto=project_id).filter(fase='A')
    
class ArtefactoDiForm(forms.Form):
    """
    Clase que genera el formulario para registrar un nuevo tipo de artefacto de la 
    fase de disenyo.
    """
    idproy = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    tipoArtefacto = forms.ModelChoiceField(label=u'Tipo de Artefacto', queryset=TipoArtefacto.objects.all())
    descr_breve = forms.CharField(label=u'Descripci\xf3n breve', widget=forms.TextInput(attrs={'size': 100}))
    descr_detallada = forms.CharField(label=u'Descripci\xf3n detallada', widget=forms.Textarea(attrs={'rows':5, 'cols':80}), max_length=400)
    complejidad = forms.IntegerField(label=u'Complejidad', widget=forms.TextInput(attrs={'size': 10}))
    adjunto = forms.FileField(required=False, label='Adjunto')
    relacionhijo = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False)
    relacionpar = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False)
    
    def clean_nombre(self):
        """"
        Verifica si ya existe un tipo de artefacto con el nombre introducido actualmente.
        """
        nombre = self.cleaned_data['nombre']
        idproy = self.data['idproy']
        tipoArtefacto = self.data['tipoArtefacto']
        try:
            proy = Proyecto.objects.get(id=idproy)
            #tipoArtefacto = TipoArtefacto.objects.get(nombre=tipoNombre, proyec_tipoar=proy)
            Artefacto.objects.get(nombre=nombre, proyecto=proy, tipoArtefacto=tipoArtefacto)
        except Artefacto.DoesNotExist:
            return nombre
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError('Ya hay un tipo de artefacto con ese nombre.')
        
    def clean_complejidad(self):
        """"
        Comprueba que la complejidad del artefacto sea intorducida con el formato correcto.
        El formato debe ser numerico, los numeros deben ser mayores o iguales a 1 y menores
        o iguales a 10.
        """
        complejidad = self.cleaned_data['complejidad']
        if complejidad>10:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        if complejidad<1:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        return complejidad
        
class ArtefactoImForm(forms.Form):
    """
    Clase que genera el formulario para registrar un nuevo tipo de artefacto de la 
    fase de implementacion.
    """
    idproy = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    tipoArtefacto = forms.ModelChoiceField(label=u'Tipo de Artefacto', queryset=TipoArtefacto.objects.all())
    descr_breve = forms.CharField(label=u'Descripci\xf3n breve', widget=forms.TextInput(attrs={'size': 100}))
    descr_detallada = forms.CharField(label=u'Descripci\xf3n detallada', widget=forms.Textarea(attrs={'rows':5, 'cols':80}), max_length=400)
    complejidad = forms.IntegerField(label=u'Complejidad', widget=forms.TextInput(attrs={'size': 10}))
    adjunto = forms.FileField(required=False, label='Adjunto')
    relacionhijo = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False)
    relacionpar = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False)
    
    def clean_nombre(self):
        """"
        Verifica si ya existe un tipo de artefacto con el nombre introducido actualmente.
        """
        nombre = self.cleaned_data['nombre']
        idproy = self.data['idproy']
        tipoArtefacto = self.data['tipoArtefacto']
        try:
            proy = Proyecto.objects.get(id=idproy)
            #tipoArtefacto = TipoArtefacto.objects.get(nombre=tipoNombre, proyec_tipoar=proy)
            Artefacto.objects.get(nombre=nombre, proyecto=proy, tipoArtefacto=tipoArtefacto)
        except Artefacto.DoesNotExist:
            return nombre
        except Proyecto.DoesNotExist:
            raise Http404(u'Request not found.')
        raise forms.ValidationError('Ya hay un tipo de artefacto con ese nombre.')
        
    def clean_complejidad(self):
        """"
        Comprueba que la complejidad del artefacto sea intorducida con el formato correcto.
        El formato debe ser numerico, los numeros deben ser mayores o iguales a 1 y menores
        o iguales a 10.
        """
        complejidad = self.cleaned_data['complejidad']
        if complejidad>10:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        if complejidad<1:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        return complejidad

class RelacionHijo(forms.Form):
    """
    Clase que genera el formulario para registrar una nueva relacion con un artefacto hijo.
    """
    relaciones = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False)
    
class ArtefactoAnEditForm(forms.Form):
    """
    Clase que genera el formulario para la edicion del registro de un artefacto de la fase de analisis.
    """
    idproy = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    idart = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    #idart = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    tipoArtefacto = forms.CharField(label=u'Tipo de Artefacto', widget=forms.TextInput(attrs={'readonly': 'readonly', 'size': 64}), max_length=50, required=False)
    #tipoArtefacto = forms.ModelChoiceField(label=u'Tipo de Artefacto', queryset=TipoArtefacto.objects.all(), widget=forms.Select(attrs={'disabled':'disabled'}), required=False)
    #proyecto = forms.ModelChoiceField(label=u'Proyecto', queryset=Proyecto.objects.all())
    #nro_artefacto = forms.IntegerField(label=u'Nro Artefacto', widget=forms.TextInput(attrs={'size': 10}))
    descr_breve = forms.CharField(label=u'Descripci\xf3n breve', widget=forms.TextInput(attrs={'size': 100}))
    descr_detallada = forms.CharField(label=u'Descripci\xf3n detallada', widget=forms.Textarea(attrs={'rows':5, 'cols':80}), max_length=400)
    complejidad = forms.IntegerField(label=u'Complejidad', widget=forms.TextInput(attrs={'size': 10}))
    adjunto = forms.FileField(required=False, label='Adjunto')
    relacionhijo = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False, widget=forms.SelectMultiple(attrs={'size': 5}))
    def clean_complejidad(self):
        """"
        Comprueba que la complejidad del artefacto sea intorducida con el formato correcto.
        El formato debe ser numerico, los numeros deben ser mayores o iguales a 1 y menores
        o iguales a 10.
        """
        complejidad = self.cleaned_data['complejidad']
        if complejidad>10:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        if complejidad<1:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        return complejidad
        
class ArtefactoDiEditForm(forms.Form):
    """
    Clase que genera el formulario para la edicion del registro de un artefacto de la fase de disenyo.
    """
    idproy = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    idart = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    #idart = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    tipoArtefacto = forms.CharField(label=u'Tipo de Artefacto', widget=forms.TextInput(attrs={'readonly': 'readonly', 'size': 64}), max_length=50, required=False)
    #tipoArtefacto = forms.ModelChoiceField(label=u'Tipo de Artefacto', queryset=TipoArtefacto.objects.all(), widget=forms.Select(attrs={'disabled':'disabled'}), required=False)
    #proyecto = forms.ModelChoiceField(label=u'Proyecto', queryset=Proyecto.objects.all())
    #nro_artefacto = forms.IntegerField(label=u'Nro Artefacto', widget=forms.TextInput(attrs={'size': 10}))
    descr_breve = forms.CharField(label=u'Descripci\xf3n breve', widget=forms.TextInput(attrs={'size': 100}))
    descr_detallada = forms.CharField(label=u'Descripci\xf3n detallada', widget=forms.Textarea(attrs={'rows':5, 'cols':80}), max_length=400)
    complejidad = forms.IntegerField(label=u'Complejidad', widget=forms.TextInput(attrs={'size': 10}))
    adjunto = forms.FileField(required=False, label='Adjunto')
    relacionhijo = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False, widget=forms.SelectMultiple(attrs={'size': 5}))
    relacionpar = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False, widget=forms.SelectMultiple(attrs={'size': 5}))
    def clean_complejidad(self):
        """"
        Comprueba que la complejidad del artefacto sea intorducida con el formato correcto.
        El formato debe ser numerico, los numeros deben ser mayores o iguales a 1 y menores
        o iguales a 10.
        """
        complejidad = self.cleaned_data['complejidad']
        if complejidad>10:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        if complejidad<1:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        return complejidad
        
class ArtefactoImEditForm(forms.Form):
    """
    Clase que genera el formulario para la edicion del registro de un artefacto de la fase de implementacion.
    """
    idproy = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    idart = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    #idart = forms.IntegerField(widget=forms.HiddenInput(), required=False)
    nombre = forms.CharField(label=u'Nombre', widget=forms.TextInput(attrs={'size': 64}))
    tipoArtefacto = forms.CharField(label=u'Tipo de Artefacto', widget=forms.TextInput(attrs={'readonly': 'readonly', 'size': 64}), max_length=50, required=False)
    #tipoArtefacto = forms.ModelChoiceField(label=u'Tipo de Artefacto', queryset=TipoArtefacto.objects.all(), widget=forms.Select(attrs={'disabled':'disabled'}), required=False)
    #proyecto = forms.ModelChoiceField(label=u'Proyecto', queryset=Proyecto.objects.all())
    #nro_artefacto = forms.IntegerField(label=u'Nro Artefacto', widget=forms.TextInput(attrs={'size': 10}))
    descr_breve = forms.CharField(label=u'Descripci\xf3n breve', widget=forms.TextInput(attrs={'size': 100}))
    descr_detallada = forms.CharField(label=u'Descripci\xf3n detallada', widget=forms.Textarea(attrs={'rows':5, 'cols':80}), max_length=400)
    complejidad = forms.IntegerField(label=u'Complejidad', widget=forms.TextInput(attrs={'size': 10}))
    adjunto = forms.FileField(required=False, label='Adjunto')
    relacionhijo = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False)
    relacionpar = forms.ModelMultipleChoiceField(queryset=Artefacto.objects.all(), required=False)
    def clean_complejidad(self):
        """"
        Comprueba que la complejidad del artefacto sea intorducida con el formato correcto.
        El formato debe ser numerico, los numeros deben ser mayores o iguales a 1 y menores
        o iguales a 10.
        """
        complejidad = self.cleaned_data['complejidad']
        if complejidad>10:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        if complejidad<1:
            raise forms.ValidationError(u'Complejidad solo puede ser un n\xfamero del 1 al 10.')
        return complejidad

class RolAsOpForm(forms.Form):
    """
    Clase que genera el formulario para asignar un rol operativo dentro de un proyecto.
    """
    rolop = forms.ModelMultipleChoiceField(queryset=Rol.objects.filter(tipo='O').exclude(id=2), widget=forms.CheckboxSelectMultiple(), required=False)